/*
 * ------------------------------------------------------------------------
 *  FECHA      HORA     NOMBRE     COMENTARIO     			     
 * ------------------------------------------------------------------------
 *  14/05/08   20:00    JAVI       Creació métodes implementació              
 *  15/05/08   21:44    ALEX       Modificación estructura de métodos
 *  18/05/08   16:55    ALEX       Implementación de la clase                   
 *  22/05/08    9:38    ALEX       Modificación en el método calculaValor...()
 * 
 */

package net.ieslaferreria.infoCiutat;

/**
 *
 * @author Alex, Javi, David y Sergio
 */
public class ValidacioImpl extends ArestaImpl implements Validacio, Comparable{
    
    private int comparable;
    
    private int tempsRuta;

    public Boolean validarParametres(ParametresCerca parametresCerca) {
        Boolean ret = Boolean.TRUE;
        int ind = 0;
        int codiProhibit;
        /* 
         * Comprova si algun dels dos punts de l'aresta pertany a alguna de les
         * xarxes prohibides pels parametres de cerca.
         */
        int size = parametresCerca.getXarxesProhibides().size();
        do {ind++;
            codiProhibit = ((Integer)parametresCerca.getXarxesProhibides().
                            elementAt(ind)).intValue();
        } while (this.getPuntInici().getCodiXarxa() != codiProhibit && 
                 this.getPuntFinal().getCodiXarxa() != codiProhibit && 
                 ind < size);
        if(ind != parametresCerca.getXarxesProhibides().size()){
            ret = Boolean.FALSE;
        }
        return ret;
    }

    public void calculaValorHeuristic(ParametresCerca parametres, Punt actual) {
        int distancia;
        distancia = Math.calculaDistancia(actual.getCoordenadaX(),
                                          actual.getCoordenadaY(),
                                          this.getPuntFinal().getCoordenadaX(),
                                          this.getPuntFinal().getCoordenadaY());
	this.comparable = (this.getTemps() + (distancia/parametres.
                                                        getVelocitatMaxima()));
    }

    public int getValorHeuristic() {
        return this.comparable;
    }

    public int compareTo(Object arg0) {
        Validacio aresta = (Validacio)arg0;
        int ret = 0;
        if (this.getValorHeuristic() > aresta.getValorHeuristic()){
            ret = 1;
        } else if (this.getValorHeuristic() < aresta.getValorHeuristic()){
            ret = -1;
        }
        return ret;
    }
    
    public int getTempsRuta(){
        return this.tempsRuta;
    }
    
    public void setTempsRuta(int nouTemps){
        this.tempsRuta = nouTemps;
    }
    
    public Boolean validarSentit(Punt puntOrigen){
        Boolean ret = Boolean.TRUE;
        if (!this.esDeDobleSentit()){
            ret = Boolean.FALSE;
        } else if (puntOrigen == this.getPuntInici()){
            ret = Boolean.FALSE;
        }
        return ret;
    }

}
